#ifndef LABY_H
#define LABY_H

#include "mat.h"

/** \file laby.h
 * \brief Application de mat.h et ens.h aux labyrinthes

 * Le fichier laby contient la definition de fonction de tests sur les
 * cases d'une matrice, ou sur directement une matrice. Il contient
 * egalement des fonctions d'affichage de pixels et de labyrinthes.
 */

/** affiche un pixel en utilisant la bibliotheque GRAPH
 * \return - 
 * \param [in] entiers i, j
 * \param [in] entier pixelsize
 */
void PrintPixel(int i, int j, int pixelsize);

/** calcule la couleur d'un pixel a partir des parametres RGB
 * \return entier, la couleur du pixel
 * \param [in] unisgned char R, G et B
 */
int getcolor(unsigned char r, unsigned char g, unsigned char b);

/** affiche une matrice en affichant recursivement tout ses pixels
 * \return - 
 * \param [in] pointeur vers une matrice
 * \param [in] entier pixelsize
 */
void MatPrint(Mat* m, int pixelsize); 

/** teste si une case est libre ou non
 * \return booleen, le resultat
 * \param [in] pointeur vers une matrice
 * \param [in] couple c
 */
bool CaseLibre(Mat* m, couple c);

/** remplit un ensemble avec n couples tires aleatoirement, n etant fixe
 * a la compilation
 * \return -
 * \param [in] entier n
 * \param [in] pointeur vars une matrice
 */
void MatSeed(int n,Mat* m);

/**
 * construit un couple 
 * \return -
 * \param [in] couple c
 * \param [in] pointeur sur une matrice
 */
void ConstruireCouple(Mat* m, couple c);

/**
 * teste si une case d'une matrice est constructible
 * \return un booleen
 * \param [in] couple c
 * \param [in] pointeur sur une matrice
 */
bool EstConstructible(Mat* m, couple c);

/**
 * teste si toutes les cases d'une matrice sont constructibles
 * \return ensemble des cases constructibles
 * \param [in] pointeur sur une matrice
 */
Ens EnsConstructible(Mat* m,char options, int pixelsize);

/** actualise les cases a cote d'une case qui vient d'etre parcourue
 * \return ensemble actualise
 * \param [in] pointeur vers une matrice
 * \param [in] ensemble e
 * \param [in] couple c
 * \param [in] char options
 * \param [in] int pixelsize
 */
Ens EnsUpdate(Mat* m, Ens e, couple c, char options, int pixelsize);

/**
 * generateur de labyrinthe
 * \return -
 * \param [in] pointeur vers une matrice
 */
void MatLaby(Mat* m, char options, int pixelsize);

/** resout le labyrinthe
 * \return ensemble des points constituant le chemin
 * \param [in] pointeur vers une matrice
 * \param [in] char options
 * \param [in] entier pixelsize
 */
Ens ResoudreLaby(Mat* m, char options, int pixelsize);

#endif
